package src.dp.easy;

public class no96 {  //不同的二叉搜索树
    /**
     * 1. 确定dp数组下标含义：输入数字 i ，有 dp[i] 种不同的BST
     * 2. 递推公式：dp[i] += dp[j-1] * dp[i-j], j从1遍历到 i，枚举所有头结点的情况，
     * 每种情况下都有dp[j-1] * dp[i-j]种，所有情况累加
     * 3. 初始化数组：dp[0] dp[1]没意义，dp[2]=1
     * 4. 遍历顺序：从小到大
     */
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        //dp[1] = 1;  //不用初始化dp[1]，因为带入到for循环里dp[1]也符合
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                //对于第i个节点，需要考虑1作为根节点直到i作为根节点的情况，所以需要累加
                //一共i个节点，对于根节点j时,左子树的节点个数为j-1，右子树的节点个数为i-j
                dp[i] += dp[j-1] * dp[i-j];
            }
        }
        return dp[n];

    }
}
